Architektur: Neuronale Netzstruktur
Neuronales Netz = einfache Dartstellung komplexer Rechnung einfacher Bausteine
LinReg mit Basisfunktionen aus LinReg mit Basis aus Linreg mit Basis aus ...
Modell = Architektur mit Satz von Parametern
Layer = Level für Lineare Regression
Mehrere Knoten (Perceptronen)
Knoten = gewichtete Summe & Aktivierungsfunktion
Wofür Aktivierung?
Ohne Aktivierung: N Layer = 1 Layer
Lineare Kombination
von Linearkombinationen
ist eine Linearkombination
Nicht-Lineare Aktivierung
ermöglicht komplexe Modellierung
Wahl der Aktivierung:
Wahl der Aktivierung:
Dying ReLU:
Dying ReLU:
PReLU, RReLU, ELU, SELU, GELU, Swish, Mish, ReLU6, ...
nützlich bei sehr seltener Aktivierung
Pytorch | Tensorflow | |
---|---|---|
Eigenschaften | Pythonic, einfache Syntax schnelleres Training dynamischer Berenchnungsgraph höhere Flexibilität |
Skalierbar Speichereffizient statisch oder dynamisch |
Hauptanwendung | Forschung Prototyping |
Grossprojekte Produktion |
Community | Forschung | Industrie |
Pakete | TorchText, TorchVision, TorchAudio | TF Extended, TF Lite, TF Serving |
Beide Frameworks sehr nützlich & weit verbreitet
Mathematik identisch & Aufbau sehr ähnlich
Wahl meist durch Arbeitsumfeld bestimmt
Wenn möglich, bereits existierende Architektur / Modelle verwenden
from torch import nn
import torch.nn.functional as F
class Classifier(nn.Module):
def __init__(self):
super().__init__()
def forward(self, x):
return x
model = Classifier()
output = model(data)
Pytorch (Meta)
from torch import nn
import torch.nn.functional as F
class Classifier(nn.Module):
def __init__(self):
super().__init__()
self.fc4 = nn.Linear(784, 10)
def forward(self, x):
x = self.fc4(x)
return x
model = Classifier()
output = model(data)
Pytorch (Meta)
from torch import nn
import torch.nn.functional as F
class Classifier(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(784, 64)
self.fc2 = nn.Linear(64, 64)
self.fc3 = nn.Linear(64, 64)
self.fc4 = nn.Linear(64, 10)
def forward(self, x):
x = self.fc1(x)
x = self.fc2(x)
x = self.fc3(x)
x = self.fc4(x)
return x
model = Classifier()
output = model(data)
Pytorch (Meta)
from torch import nn
import torch.nn.functional as F
class Classifier(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(784, 64)
self.fc2 = nn.Linear(64, 64)
self.fc3 = nn.Linear(64, 64)
self.fc4 = nn.Linear(64, 10)
def forward(self, x):
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = F.relu(self.fc3(x))
x = self.fc4(x)
return x
model = Classifier()
output = model(data)
Pytorch (Meta)
from torch import nn
import torch.nn.functional as F
class Classifier(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(784, 64)
self.fc2 = nn.Linear(64, 64)
self.fc3 = nn.Linear(64, 64)
self.fc4 = nn.Linear(64, 10)
def forward(self, x):
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = F.relu(self.fc3(x))
x = F.softmax(self.fc4(x), dim=1)
return x
model = Classifier()
output = model(data)
Pytorch (Meta)
from torch import nn
import torch.nn.functional as F
class Classifier(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(784, 64)
self.fc2 = nn.Linear(64, 64)
self.fc3 = nn.Linear(64, 64)
self.fc4 = nn.Linear(64, 10)
def forward(self, x):
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = F.relu(self.fc3(x))
x = F.softmax(self.fc4(x), dim=1)
return x
model = Classifier()
output = model(data)
Pytorch (Meta)
import tensorflow as tf
from tensorflow.keras import layers
class Classifier(tf.keras.Model):
def __init__(self):
super(Classifier, self).__init__()
self.fc1 = layers.Dense(64, activation='relu')
self.fc2 = layers.Dense(64, activation='relu')
self.fc3 = layers.Dense(64, activation='relu')
self.fc4 = layers.Dense(10, activation='softmax')
def call(self, x):
x = self.fc1(x)
x = self.fc2(x)
x = self.fc3(x)
x = self.fc4(x)
return x
model = Classifier()
model.build((None, 784))
model(data)
Tensorflow (Google)
import torch.nn as nn
model = nn.Sequential(
nn.Linear(784, 64),
nn.ReLU(),
nn.Linear(64, 64),
nn.ReLU(),
nn.Linear(64, 64),
nn.ReLU(),
nn.Linear(64, 10),
nn.Softmax(dim=1)
)
output = model(data)
Pytorch (Meta)
from tensorflow.keras import models
model = models.Sequential([
layers.Dense(64, activation='relu', input_shape=(784,)),
layers.Dense(64, activation='relu'),
layers.Dense(64, activation='relu'),
layers.Dense(10, activation='softmax')
])
model(data)
Tensorflow (Google)
for images, labels in trainloader:
prediction = model(images)
loss = criterion(prediction, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
trainloader = DataLoader(trainset, batch_size=256, shuffle=True)
criterion = nn.CrossEntropyLoss()
Pytorch
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.003)
Pytorch
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.003)
for e in range(epochs):
Pytorch
Epoche: alle Daten trainieren
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.003)
for e in range(epochs):
for images, labels in trainloader:
Pytorch
Batchweise Input & Target
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.003)
for e in range(epochs):
for images, labels in trainloader:
prediction = model(images)
loss = criterion(prediction, labels)
Pytorch
Forward-Pass
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.003)
for e in range(epochs):
for images, labels in trainloader:
prediction = model(images)
loss = criterion(prediction, labels)
optimizer.zero_grad()
loss.backward()
Pytorch
Backward-Pass
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.003)
for e in range(epochs):
for images, labels in trainloader:
prediction = model(images)
loss = criterion(prediction, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
Pytorch
Update
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.003)
for e in range(epochs):
running_loss = 0
for images, labels in trainloader:
prediction = model(images)
loss = criterion(prediction, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
running_loss += loss.item()
Pytorch
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.003)
for e in range(epochs):
running_loss = 0
for images, labels in trainloader:
prediction = model(images)
loss = criterion(prediction, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
running_loss += loss.item()
Pytorch
model.compile(optimizer=optimizers.Adam(learning_rate=0.003),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
history = model.fit(train_images, train_labels, epochs=1, batch_size=64)
print(f'Training loss: {history.history["loss"][0]}')
Tensorflow
Ableitung der Kosten -> Richtung für Verbesserung -> Update
Gradient Descent
Gradient Descent
Ableitung der Kosten -> Richtung für Verbesserung -> Update
Gradient Descent
Ableitung der Kosten -> Richtung für Verbesserung -> Update
Gradient Descent
Ableitung der Kosten -> Richtung für Verbesserung -> Update
Gradient Descent
Gradient Descent
Gradient Descent
Gradient Descent
Gradient Descent
Gradient Descent
Gradient Descent
Gradient Descent
Gradient Descent
Berechnet Ableitung
für jedes Update
mit gesamten Datensatz
folgt exakt steilstem Abstieg
Bei Millionen von Daten
sehr rechenintensiv...
Gradient Descent
Gradient Descent
Berechnet Ableitung
für jedes Update
mit gesamten Datensatz
folgt exakt steilstem Abstieg
Bei Millionen von Daten
sehr rechenintensiv...
Stochastic Gradient Descent (SGD)
Zerlegt Datensatz in Batches
Update nach jeder Batch
folgt Schätzung des steilsten Abstiegs
Forschritt kann Schwanken
Schnelle Konvergenz
dank schneller Rechnung
Gradient Descent
SGD
Momentum
Hands-On: MNIST Classifier
Bearbeiten Sie dieses Notebook
Die Lösung finden Sie in diesem Notebook